package com.观察者模式.案列1;

import com.观察者模式.案列1.observer.Observer;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * 此类是被观察者【气象站的实现类】，是一个核心类
 * 此类包含：
 *      1：最新的天气情况
 *      2：含有CunrentCondition对象的集合【观察者集合】
 *      3：当前天气数据有更新时，就主动向所有的观察者推送最新数据
 */

@Data
public class WeatherData implements Subject {

    private int wd;

    private int qy;

    private int sd;

    /**
     * 存储所有的观察者
     */
    private List<Observer> list=new ArrayList<>();



    /**
     * 该气象站检测数据发生变化了，首先更新自己内部的数据
     */
    public void setDate(int wd, int qy, int sd) {
        this.wd=wd;
        this.qy=qy;
        this.sd=sd;
        /**
         * 然后将最新数据推送给所有的观察者
         */
        dataChange();
    }
    /**
     * 然后将最新数据推送给所有的观察者
     */
    public void dataChange(){
        notifyObserver();
    }



    /**
     * 实现注册方法
     * @param o
     */
    @Override
    public void registObserver(Observer o) {
        list.add(o);
    }

    /**
     * 实现删除方法
     * @param o
     */
    @Override
    public void removeObserver(Observer o) {
        if (list.contains(o)){
            list.remove(o);
        }

    }

    /**
     * 实现推送给所有观察者方法
     */
    @Override
    public void notifyObserver() {
        list.forEach(observer -> {
            observer.update(this.wd,this.qy,this.sd);
        });
    }
}
